package com.chenjt.jvm.first.nine_String;

/**
 * 注释：
 * String的基本使用：体现String的不可变性
 *
 * @author chenjt
 * @date 2025/6/12 15:20
 */
public class StringTest1 {

    public static void main(String[] args) {
//        test1();
//        test2();
        test3();
    }


    public static void test1() {
        /**
         * 字面量定义的方式（String s1 = "abc"），"abc"存储在字符串常量池中
         * （
         * 字符串常量池中不是允许存储相同的字符串的
         * 当s1和s2的值相同时，s1和s2存储的地址相同
         * 当s1和s2的值不同时，s1和s2存储的地址不同
         * ）
         */
        String s1 = "abc";
        String s2 = "abc";
        s1 = "hello";

        /**
         * 1.s1没有赋值为 hello，以下结果是true
         * 1.s1赋值为 hello，以下结果是false
         */
        System.out.println(s1 == s2);

        System.out.println(s1);
        System.out.println(s2);

    }


    public static void test2() {
        String s1 = "abc";
        String s2 = "abc";

        s2 += "def";

        /**
         * 常量池中的内容是不可变的，当修改时，
         * 是需要重新创建一个新的字符串对象的
         *
         * 从另外一个角度来看，String底层是一个数组，
         * 数组的长度一旦开辟是不可变的，修改了字符串的值，
         * 底层会重新创建一个数组
         *
         */
        System.out.println(s2);// abcdef
        System.out.println(s1);// abc

    }

    /**
     * s1.replace是重新返回了一个新的对象，
     * 因为常量池中的内容是不可变的
     */
    private static void test3() {
        String s1 = "abc";
        String s2 = s1.replace("a", "m");
        System.out.println(s1);// abc
        System.out.println(s2);// mbc

    }

}
